package com.zsrt.java.day20161227.lh.homework.demo05;

import java.util.Arrays;

import com.zsrt.java.day20161227.lh.homework.util.ArrayUtil;

/**
 * 题目：   5张    3张牌加起来等于10的倍数   就说明有牛    剩下的2张牌 加起来 根10 求模    5 
 * 
 * 已知：
 * 		1.6个人玩
 * 		2.3张牌加起来等于10的倍数   就说明有牛
 * 		3.剩下的2张牌 加起来 求模
 * 
 * 求：
 * 	1.河牌有什么牌
 *  2.每一个人分别拿了什么牌  并且有没有牛  
 *  		如果没有牛 请你告诉我最大的牌是什么   黑 红 梅 方
 *  		如果没有牛 请你告诉我是几    10 牛牛
 *  3.谁赢了
 *  
 *  思路：
 *  	1.一个数组表示组牌
 *  	2.10个玩家  10个数组 ，随机数拿牌 
 *  	3.定义  分离牌面数字(charAt(0))
 *  	4.数组中5个数中取三个
 *  			相加求模  是否成牛   
 *  			得到剩下两个数的和求模  牛几
 *  	5.没牛玩家
 *  			遍历玩家的牌得到最大的牌的点数
 *  
 *  	6.先比较有牛的玩家 
 *  			点数相同 比较个牌的大小（默认10jqk等大） ，个牌相同 再比较花色
 *  			点数不同，10jqk最大
 *  	7.比较没牛玩家牌
 *  			点数相同 比较个牌的大小（默认10jqk等大） ，个牌相同 再比较花色
 *  			点数不同，10jqk最大
 *  	8.谁赢了
 * 
 * @author My
 *
 */
public class BullFight2 {
	
	public static void main(String[] args) {
		String[] pai=new String[52];
		String[] xz={"黑","桃","梅","方"};
		String[] sz={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
		String st="";
		StringBuffer sf=new StringBuffer();
		
		//生成牌
		for(int i=0;i<4;i++){
			String stb=xz[i];
			for(int j=0;j<13;j++){
				String sts=sz[j];
				st=stb+sts+",";
				sf.append(st);
			}
		}
		pai=sf.toString().split(",");
		
		
		//玩家拿牌
		String[][] wanjia=new String[10][5];
		String[] hepai=new String[2];
		int temp=52;
		
		for(int i=0;i<5;i++){
			for(int j=0;j<10;j++){
				int ran = (int)(Math.random()*temp);
				wanjia[j][i]=pai[ran];
				temp--;
				pai=ArrayUtil.deleteArray(pai, pai[ran]);
			}
		}
		//剩下河牌
		hepai=pai;
		
		
		//打印牌
		for(int i=0;i<10;i++){
			System.out.println("玩家"+(i+1)+"的牌:"+Arrays.toString(wanjia[i]));
		}
		System.out.println("河牌：\t"+Arrays.toString(hepai));
		
		
		//分离玩家牌面的花色和数字
		char[][] point=new char[10][5];
		char[][] hs=new char[10][5];
		
		for(int i=0;i<10;i++){
			point[i]=fenlisz(wanjia[i]);
		}
		for(int i=0;i<10;i++){
			hs[i]=fenlihs(wanjia[i]);
		}
		
		
		//把点数 数组 转换成1到10的数字
		int[][] pointInt = new int[10][5];
		for(int i=0;i<10;i++){
			pointInt[i]=shuzizhuanhua(point[i]);
		}
		
		//把花色转换成数字1~4
		int[][] hsInt = new int[10][5];
		for(int i=0;i<10;i++){
			
			hsInt[i]=huasezhuanhua(hs[i]);
		}
		
		/*for(int i=0;i<10;i++){
			System.out.println(Arrays.toString(pointInt[i]));
		}
		for(int i=0;i<10;i++){
			System.out.println(Arrays.toString(hsInt[i]));
		}*/
		
		
		
		// 判断是否有牛，牛几;没牛时，找出最大的牌 
		int[]  niuMa=new int[10];
		
		StringBuffer winSt=new StringBuffer();
		
		for(int i=0;i<10;i++){
			niuMa[i]=yMeiNiu(pointInt[i]);
			
			if(-1 != niuMa[i]){
				if(niuMa[i] == 0){
					System.out.println("玩家"+(i+1)+"有牛：牛牛");
					winSt.append(10+10+",");
				}else{
					System.out.println("玩家"+(i+1)+"有牛：牛"+niuMa[i]);
					winSt.append(10+niuMa[i]+",");
				}
			}else{
				//没牛,返回最大牌
				int maxpai=maxValue(pointInt[i]);
				System.out.println("玩家"+(i+1)+"无牛：最大牌为"+maxpai);
				winSt.append(maxpai+",");
			}
		}
		
		//取出玩家牌面点数
		String[] bjPoint=winSt.toString().split(",");
		
		//转换成Int类型的数组
		int[] bjpointInt=new int[10];
		
		for(int i=0;i<bjPoint.length;i++){
			bjpointInt[i]=Integer.parseInt(bjPoint[i]);
		}
		
//		System.out.println("点数玩家：的最大的点数："+Arrays.toString(bjpointInt));
		
		
		
		//转换后的最大值
		int maxa=maxValue(bjpointInt);
		/**
		 * 谁赢了
		 */
		for(int i=0;i<10;i++){
			int b=Integer.parseInt(bjPoint[i]);
			if(b==maxa){
				System.out.println();
				System.out.println("玩家"+(i+1)+"赢");
			}
			
			
				
			
		}


	}
	
	/**
	 * 冒泡排序
	 * 
	 * 	01 12 23 34    	0 1 2 3
	 *	01 12 23		0 1 2
	 *	01 12			0 1
	 *	01				0

	 * @param args
	 */
	
	public static int[] popSort(int[] arr){
		int len=arr.length;
		for(int i=0;i<len-1;i++){
			for(int j=1;j<len;j++){
				int temp;
				if(arr[j-1]>arr[j]){
					temp=arr[j];
					arr[j]=arr[j-1];
					arr[j-1]=temp;
				}
			}
		}
		return arr;
	}
	/**
	 * 求数组最大值
	 * @param arr 数组
	 * @return 最大值
	 */
	public static int maxValue(int[] arr){
		int len=arr.length;
		arr=popSort(arr);
		return arr[len-1];
		
	}
	
	public static int maxValueIndex(int[] arr){
		int len=arr.length;
		arr=popSort(arr);
		for(int i=0;i<len;i++){
			if(arr[len-1]==arr[i]){
				return i;
			}
		}
		return 0;
	}
		
/**
 * @param a 3个数相加等于10的数的地标
 * @param b 3个数相加等于10的数的地标
 * @param c	3个数相加等于10的数的地标
 * @param wanjiapai 成牛的玩家的牌
 * @return 牛几
 */
	public static int niuJi(int a,int b,int c,int[] wanjiapai){
		int nj=0;
		int sum=0;
		//剩下两张手牌相加
		for(int i=0;i<wanjiapai.length;i++){
			if(i!=a && i!=b && i!=c){
				sum+=wanjiapai[i];
			}
			nj=sum%10;
		}
		
		return nj;
	}
	
	
	/**
	 * 判断是否有牛
	 * 5个里3个相加：和与10求模
	 * 
	 * 012	013		014		023		024		034
	 * 123	124		134		
	 * 234
	 * 
	 * @param wjpm 玩家牌面的点数数组
	 * @return	牛几
	 */
	public static int yMeiNiu(int[] wjpm){
		
		int result  = -1;
		//有牛的组合
		int[][]youNiu = {{0,1,2},{0,1,3},{0,1,4},{0,2,3},{0,2,4},{0,3,4},{1,2,3},{1,2,4},{1,3,4},{2,3,4}};
		for(int i=0;i<10;i++){
			int index1 = youNiu[i][0];
			int index2 = youNiu[i][1];
			int index3 = youNiu[i][2];
			
			//三个数相加与10求模是否等于0
			if((wjpm[index1]+wjpm[index2]+wjpm[index3])%10 == 0){
				
//				System.out.println("有牛");
				result = niuJi(index1,index2,index3,wjpm);
				break;
			}else{
//				System.out.println("没牛");
			}
		}
		return result;
	}
	

	/**
	 * 取出花色
	 * @param wanjia01
	 */
	public static char[] fenlihs(String[] wanjia01) {
		char[] hs=new char[5];
		for(int i=0;i<5;i++){
			hs[i]=wanjia01[i].charAt(0);
		}
		return hs;
	}
	
	/**
	 * 取出数字
	 * @param wanjia01
	 */
	public static char[] fenlisz(String[] wanjia01) {
		char[] fjsz=new char[5];
		for(int i=0;i<5;i++){
			fjsz[i]=wanjia01[i].charAt(1);
		}
		return fjsz;
	}
	
	/**
	 * 
	 * @param a 牌点数转换成斗牛的数
	 * @return
	 */
	public static int[] shuzizhuanhua(char[] a){
		int[] ds=new int[5];
		for(int i=0;i<5;i++){
			int b= a[i];
			switch ((char)b) {
				case '1':ds[i]=10;break;
				case 'J':ds[i]=10;break;
				case 'Q':ds[i]=10;break;
				case 'K':ds[i]=10;break;
				case 'A':ds[i]=1;break;
				case '2':ds[i]=2;break;
				case '3':ds[i]=3;break;
				case '4':ds[i]=4;break;
				case '5':ds[i]=5;break;
				case '6':ds[i]=6;break;
				case '7':ds[i]=7;break;
				case '8':ds[i]=8;break;
				case '9':ds[i]=9;break;
			}
		}
		return ds;
	}
	

	/**
	 * 
	 * @param a 牌面花色转换为数字
	 * @return
	 */
	public static int[] huasezhuanhua(char[] a){
		int[] ds=new int[5];
		for(int i=0;i<5;i++){
			   char b= a[i];
			   switch (b) {
			   case '黑':ds[i]=4;break;
			   case '桃':ds[i]=3;break;
			   case '梅':ds[i]=2;break;
			   case '方':ds[i]=1;break;
			   }
		}
		return ds;
	}
}
